cds: enable outset shadows
authorChris Cummins <christopher.e.cummins@intel.com>
Fri, 5 Apr 2013 09:54:03 +0000 (10:54 +0100)
committerRob Bradford <rob@linux.intel.com>
Tue, 9 Apr 2013 11:52:47 +0000 (12:52 +0100)
Adds conditional code paths to GdkCssShadowValue for painting outset
shadows, and allows shadows to be applied in two passes (first outset
then inset). This can be used to draw csd shadows in outer window
borders.

https://bugzilla.gnome.org/show_bug.cgi?id=695998
Signed-off-by: Rob Bradford <rob@linux.intel.com>
gtk/gtkcssshadowsvalue.c
gtk/gtkcssshadowsvalueprivate.h
gtk/gtkcssshadowvalue.c
gtk/gtkcssshadowvalueprivate.h
gtk/gtkthemingbackground.c

index 0438316935a2dfc697ea5abb3826e852146833f4..a71f4fe08f52afa643ea6dd2e977571518276139 100644 (file)
@@ -287,7 +287,8 @@ _gtk_css_shadows_value_paint_spinner (const GtkCssValue *shadows,
 void
 _gtk_css_shadows_value_paint_box (const GtkCssValue   *shadows,
                                   cairo_t             *cr,
-                                  const GtkRoundedBox *padding_box)
+                                  const GtkRoundedBox *padding_box,
+                                  gboolean             inset)
 {
   guint i;
 
@@ -295,6 +296,7 @@ _gtk_css_shadows_value_paint_box (const GtkCssValue   *shadows,
 
   for (i = 0; i < shadows->len; i++)
     {
-      _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box);
+      if (inset == _gtk_css_shadow_value_get_inset (shadows->values[i]))
+        _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box);
     }
 }
index f77b22319aa1626f4033d45e6358597a51eb0c9c..7ee619e8dec28ac23499dca35bb42ba8b8a0c8e0 100644 (file)
@@ -46,7 +46,8 @@ void            _gtk_css_shadows_value_paint_spinner  (const GtkCssValue
                                                        gdouble                   progress);
 void            _gtk_css_shadows_value_paint_box      (const GtkCssValue        *shadows,
                                                        cairo_t                  *cr,
-                                                       const GtkRoundedBox      *padding_box);
+                                                       const GtkRoundedBox      *padding_box,
+                                                       gboolean                  inset);
 
 G_END_DECLS
 
index 618288807af8d3b7e9571d013c632880a9f7f67a..6e61cab42628e592751d1607aa1defe259f0ee15 100644 (file)
@@ -445,6 +445,14 @@ _gtk_css_shadow_value_paint_spinner (const GtkCssValue *shadow,
   cairo_restore (cr);
 }
 
+gboolean
+_gtk_css_shadow_value_get_inset (const GtkCssValue *shadow)
+{
+  g_return_val_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW, FALSE);
+
+  return shadow->inset;
+}
+
 void
 _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
                                  cairo_t             *cr,
@@ -457,15 +465,21 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
 
   cairo_save (cr);
 
-  _gtk_rounded_box_path (padding_box, cr);
-  cairo_clip (cr);
+  if (shadow->inset)
+    {
+      _gtk_rounded_box_path (padding_box, cr);
+      cairo_clip (cr);
+    }
 
   box = *padding_box;
   _gtk_rounded_box_move (&box,
                          _gtk_css_number_value_get (shadow->hoffset, 0),
                          _gtk_css_number_value_get (shadow->voffset, 0));
   spread = _gtk_css_number_value_get (shadow->spread, 0);
-  _gtk_rounded_box_shrink (&box, spread, spread, spread, spread);
+  if (shadow->inset)
+    _gtk_rounded_box_shrink (&box, spread, spread, spread, spread);
+  else /* Outset */
+    _gtk_rounded_box_grow (&box, spread, spread, spread, spread);
 
   clip_box = *padding_box;
   radius = _gtk_css_number_value_get (shadow->radius, 0);
@@ -475,7 +489,8 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
 
   cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
   _gtk_rounded_box_path (&box, cr);
-  _gtk_rounded_box_clip_path (&clip_box, cr);
+  if (shadow->inset)
+    _gtk_rounded_box_clip_path (&clip_box, cr);
 
   gdk_cairo_set_source_rgba (cr, _gtk_css_rgba_value_get_rgba (shadow->color));
   cairo_fill (cr);
index 98efa67ab43e9054c8bf1b0caeb0adf80b6b0f33..0688fc3301cdfcb180c1439f1a2059bc87efaea9 100644 (file)
@@ -34,6 +34,8 @@ GtkCssValue *   _gtk_css_shadow_value_new_for_transition (GtkCssValue
 
 GtkCssValue *   _gtk_css_shadow_value_parse           (GtkCssParser             *parser);
 
+gboolean        _gtk_css_shadow_value_get_inset       (const GtkCssValue        *shadow);
+
 void            _gtk_css_shadow_value_paint_layout    (const GtkCssValue        *shadow,
                                                        cairo_t                  *cr,
                                                        PangoLayout              *layout);
index 579d2be4dea32abe70be40ad73cd70fa39cd87b1..706752b082431adc01175140c512e9fc2ed50a2f 100644 (file)
@@ -265,11 +265,13 @@ _gtk_theming_background_paint_layer (GtkThemingBackground *bg,
 
 static void
 _gtk_theming_background_apply_shadow (GtkThemingBackground *bg,
-                                      cairo_t              *cr)
+                                      cairo_t              *cr,
+                                      gboolean              inset)
 {
   _gtk_css_shadows_value_paint_box (_gtk_style_context_peek_property (bg->context, GTK_CSS_PROPERTY_BOX_SHADOW),
                                     cr,
-                                    &bg->padding_box);
+                                    &bg->padding_box,
+                                    inset);
 }
 
 static void
@@ -358,6 +360,8 @@ _gtk_theming_background_render (GtkThemingBackground *bg,
   cairo_save (cr);
   cairo_translate (cr, bg->paint_area.x, bg->paint_area.y);
 
+  _gtk_theming_background_apply_shadow (bg, cr, FALSE); /* Outset shadow */
+
   _gtk_theming_background_paint_color (bg, cr, background_image);
 
   for (idx = _gtk_css_array_value_get_n_values (background_image) - 1; idx >= 0; idx--)
@@ -365,7 +369,7 @@ _gtk_theming_background_render (GtkThemingBackground *bg,
       _gtk_theming_background_paint_layer (bg, idx, cr);
     }
 
-  _gtk_theming_background_apply_shadow (bg, cr);
+  _gtk_theming_background_apply_shadow (bg, cr, TRUE);  /* Inset shadow */
 
   cairo_restore (cr);
 }